from pypika.functions import DistinctOptionFunction
from pypika.terms import CustomFunction
import frappe

class DM_GROUP_CONCAT(DistinctOptionFunction):
    def __init__(self, column: str, separator: str = ",", alias: str | None = None):
        """达梦数据库的 GROUP_CONCAT 函数实现，使用 LISTAGG
        
        达梦数据库不支持 GROUP_CONCAT，但提供了等效的 LISTAGG 函数。
        LISTAGG 函数将一组值连接成一个字符串，并在值之间插入指定的分隔符。
        
        Args:
            column (str): 要连接的列名
            separator (str, optional): 分隔符. 默认为 ",".
            alias (str | None, optional): 别名. 默认为 None.
            
        示例:
            SELECT LISTAGG(name, ',') FROM users GROUP BY department
        """
        super().__init__("LISTAGG", column, separator, alias=alias)


class DM_MATCH(DistinctOptionFunction):
    def __init__(self, column: str, *args, **kwargs):
        """达梦数据库的全文搜索函数实现，使用 CONTAINS
        
        达梦数据库使用 CONTAINS 函数进行全文搜索。
        CONTAINS 函数支持多种搜索语法，包括：
        - 精确匹配：使用引号，如 'word'
        - 模糊匹配：使用通配符，如 'word%'
        - 多词匹配：使用 AND/OR，如 'word1 AND word2'
        
        Args:
            column (str): 要搜索的列名
            *args: 搜索条件
            **kwargs: 其他参数，包括 alias（别名）
            
        示例:
            SELECT * FROM articles WHERE CONTAINS(content, 'search AND terms')
        """
        alias = kwargs.get("alias")
        super().__init__("CONTAINS", column, *args, alias=alias)
        self._Against = False

    def get_function_sql(self, **kwargs):
        s = super(DistinctOptionFunction, self).get_function_sql(**kwargs)

        if self._Against:
            return f"{s} IN BOOLEAN MODE"

        return s

    def Against(self, text):
        """设置搜索模式为布尔模式
        
        Args:
            text: 搜索文本
            
        Returns:
            self: 返回自身以支持链式调用
        """
        self._Against = True
        self.args = (self.args[0], text)
        return self


class DM_COMBINE_DATETIME(CustomFunction):
    """达梦数据库的日期时间合并函数实现"""
    def __init__(self, datepart, timepart, alias=None):
        # 达梦数据库使用 TO_DATE 函数将字符串转换为日期时间
        super().__init__("TO_DATE", datepart, timepart, alias=alias)


class DM_DATE_FORMAT(CustomFunction):
    """达梦数据库的日期格式化函数实现"""
    def __init__(self, date, format_str, alias=None):
        # 达梦数据库使用 TO_CHAR 函数格式化日期
        super().__init__("TO_CHAR", date, format_str, alias=alias)


class DM_UNIX_TIMESTAMP(CustomFunction):
    """达梦数据库的 UNIX_TIMESTAMP 函数实现
    
    自标准时区的'1970-01-01 00:00:00 +0:00'到本地会话时区的指定时间的秒数差。
    如果参数为空，表示到当前时间。
    
    参数：
        date: 可以是 DATETIME、TIME、DATE、timestamp with time zone、
             timestamp with LOCAL time zone 类型，也可以是字符串，
             或 YYYYMMDD、YYMMDD、YMMDD、YYYMMDD 格式的整型。
    
    示例：
        UNIX_TIMESTAMP(timestamp '1970-01-01 08:00:00') -> 0
        UNIX_TIMESTAMP('1970-01-01 17:00:00') -> 32400
        UNIX_TIMESTAMP(20120608) -> 1339084800
    """
    def __init__(self, date=None, alias=None):
        if date is None:
            super().__init__("UNIX_TIMESTAMP", alias=alias)
        else:
            super().__init__("UNIX_TIMESTAMP", date, alias=alias)
